package storageclasses;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

public class Bank {

	private HashMap<String, ArrayList<MedicalRecord>> map;
	public static int count = 0;

	public static int inc() {
		count++;
		return count - 1;
	}

	public Bank() {
		map = new HashMap<String, ArrayList<MedicalRecord>>();
	}

	public String addRecord(String patient, String personnummer,
			MedicalRecord medrec, int access) {

		if (access == 2) {
			if (map.get(patient) == null) { // om patienten inte lidit av något
				// innan
				ArrayList<MedicalRecord> newList = new ArrayList<MedicalRecord>();
				newList.add(medrec);
				map.put(patient, newList);
			} else {
				map.get(patient).add(medrec);

			}
			printAudit(personnummer,
					"lade till ID: " + medrec.getID() + " för", patient);
			return personnummer + " wrote to patient " + patient
					+ "s record.\n" + "ID: " + medrec.getID() + "\nText: "
					+ medrec.getData();
		} else {
			printAudit(personnummer, "försökte lägga till ID: "
					+ medrec.getID() + " för", patient);
		}
		return "Access denied";
	}

	public String getMedicalRecords(String patient, String personnummer,
			String division, int access) {
		ArrayList<MedicalRecord> list = getMedicalRecordsList(patient,
				personnummer, division, access);
		StringBuilder sb = new StringBuilder();
		if (list == null) {
			sb.append("No medical records / or no access to records");
			return sb.toString();
		}
		sb.append("Medical records for " + patient + "\n");
		sb.append("-------------------------------\n");
		for (MedicalRecord mr : list) {
			sb.append("\tID: " + mr.getID() + "\n");
			sb.append("\tDoctor: " + mr.getDoc() + "\n");
			sb.append("\tNurse: " + mr.getNurse() + "\n");
			sb.append("\tDivision: " + mr.getDivision() + "\n");
			sb.append("\n");
			sb.append("\t" + mr.getData() + "\n\n");
		}

		return sb.toString();
	}

	private ArrayList<MedicalRecord> getMedicalRecordsList(String patient,
			String personnummer, String division, int access) {
		if (map.get(patient) == null) { // Om patienten inte har något record
			System.out.println("Patient " + patient + " har ingen journal");
			return null;
		} else {
			ArrayList<MedicalRecord> list = map.get(patient);

			if (access == 3) { // Om socialstyrelsen vill ha något
				printAudit(personnummer, "läste", patient);
				return list;

			} else if (access == 1) { // Om en sjuksköterska vill åt något
				for (int i = 0; i < list.size(); i++) {
					if (list.get(i).getNurse() == personnummer) {
						printAudit(personnummer, "läste", patient);
						return list;
					}
				}

			} else if (access == 2) { // Om en doktor vill ha något
				for (int i = 0; i < list.size(); i++) {
					if (list.get(i).getDoc() == personnummer) {
						printAudit(personnummer, "läste", patient);
						return list;
					}

				}
			} else if (patient.equals(personnummer)) {
				return list; // Patienten får sin egen journal
			}

			// Samma division

			for (int i = 0; i < list.size(); i++) {
				if (list.get(i).getDivision().equals(division)) {

					printAudit(personnummer, "läste", patient);
					return list;
				}
			}

		}
		printAudit(personnummer, "nekades läsa", patient);
		return null;
	}

	public String writeToMedicalRecord(int id, String patient,
			String personnummer, String division, int access, String data) {

		ArrayList<MedicalRecord> list = map.get(patient);

		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).getID() == id) {
				MedicalRecord mr = list.get(i);
				if (personnummer.equals(mr.getDoc())
						|| personnummer.equals(mr.getNurse())
						|| (access == 2 && division.equals(mr.getDivision()))
						|| access == 3) {
					list.get(i).changeData(data);
					printAudit(personnummer, "skrev till ID: " + id + " för",
							patient);
					return personnummer + "skrev till ID: " + id + " för"
							+ patient;
				}
			}
		}
		return "Access denied.";
	}

	/*
	 * public void removeID(int id, String patient, String personnummer, int
	 * access) { if (access == 3) {
	 * 
	 * ArrayList<MedicalRecord> list = map.get(patient);
	 * 
	 * for (int i = 0; i < list.size(); i++) { if (list.get(i).getID() == id) {
	 * list.remove(i); printAudit(personnummer, "raderade ID: " + id + " för",
	 * patient, getDateTime()); } }
	 * 
	 * } else { printAudit(personnummer, "försökte radera ID: " + id + " för",
	 * patient, getDateTime()); } }
	 */

	public String removeAll(String patient, String personnummer, int access) {
		if (access == 3) {

			int size = map.get(patient).size();
			for (int i = 0; i < size; i++) {
				map.get(patient).remove(0);
			}

			printAudit(personnummer, "raderade allt för", patient);
			return "Deleted all record(s) for patient " + patient;
		} else {
			printAudit(personnummer, "försökte radera allt för ", patient);
		}
		return "Access denied";
	}

	public void printAudit(String who, String action, String what) {
		Audit.addAudit(who, action, what);
	}

}
